package com.loft.model.bitmapdownload;

import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import com.loft.R;
import com.loft.threadtask.BitmapDownloaderTask;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.util.Log;
import android.widget.ImageView;

/**
 * @ClassName: ImageLoader
 * @Description:下载图片类
 * @CreateDate: 2012/04/18
 * @Version: v1.0.0
 * 
 */
public class ImageLoader {

	private HashMap<String, Bitmap> cache = new HashMap<String, Bitmap>();// Activity内缓存
	private static Set<String> urlSet = new HashSet<String>();

	public static Set<String> getUrlSet() {
		return urlSet;
	}

	final int img_default = R.drawable.dialog_circle;
	private File cacheDir;

	/**
	 * 
	 * function: ImageLoader.java Description: 显示图片 Create Date: 2012/04/18
	 * 
	 * @param savePath
	 * @param url
	 * @param imageView
	 * @param albumName
	 * @param imageName
	 */

	public void loadBitmap(String savePath, String url, ImageView imageView,
			String albumName, String imageName) {
		try {
			if (url != null) {// 判断url是否为空
				if (cache.containsKey(url)) {// 查找缓存是否存在此地址
					Log.v("cache", savePath + albumName + "/" + imageName);
					imageView.setImageBitmap(cache.get(url));
				} else {
					cacheDir = new File(savePath + albumName);
					File imgFile = new File(savePath + albumName + "/"
							+ imageName);
					if (imgFile.exists()) {
						Log.v("sdcard", savePath + albumName + "/" + imageName);
						Bitmap bitmap = BitmapFactory.decodeFile(imgFile
								.getPath());
						if (bitmap != null) {
							imageView.setImageBitmap(bitmap);
						} else {
							imageView.setImageResource(img_default);
						}

						cache.put(url, bitmap);
					} else {
						imageView.setImageResource(img_default);
						// 在gallery滚动过程中会出现反复启动下载线程的问题，
						// 因为一个url可能已经启动一个子线程开始下载了，
						// 但是还没下载完，adapter的getview方法再次调用这个方法
						// 这个时候可能会再启一遍同一幅图的下载
						// 这里建了一个set，当url第一次出现时进入下载线程，
						// 出现重复情况则跳过；
						// 当出现httpConnection TImeOut情况时，从该set里删除此url
						if (!urlSet.contains(url)) {
							BitmapDownloaderTask task = new BitmapDownloaderTask(
									imageView, cache, imgFile, 0);
							task.execute(url);
							Log.v("download", savePath + albumName + "/"
									+ imageName);
							urlSet.add(url);
						}
					}
				}
			} else {
				imageView.setImageResource(img_default);
			}
		} catch (Exception e) {
			// return;
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * FunName: ImageLoader.java Description: 显示缩略图 Create Date: 2012/04/18
	 * 
	 * @param savePath
	 * @param url
	 * @param imageView
	 * @param albumName
	 * @param imageName
	 * @param imageSize
	 *            压缩图片大小
	 */

	public void loadBitmapThumbnail(String savePath, String url,
			ImageView imageView, String albumName, String imageName,
			int imageSize) {
		try {
			if (url != null) { // 判断url是否为空
				if (cache.containsKey(url)) { // 查找缓存是否存在此地址
					Log.v("cache", savePath + albumName + "/" + imageName);
					imageView.setImageBitmap(cache.get(url));
				} else {
					cacheDir = new File(savePath + albumName);
					File imgFile = new File(savePath + albumName + "/"
							+ imageName);
					if (imgFile.exists()) {
						Log.v("sdcard", savePath + albumName + "/" + imageName);
						BitmapFactory.Options options = new Options();
						int proportion = (int) (imgFile.length() / imageSize);
						if (proportion <= 1) {
							options.inSampleSize = 1;
						} else {
							options.inSampleSize = proportion;
						}
						Bitmap bitmap = BitmapFactory.decodeFile(imgFile
								.getPath(), options);
						if (bitmap != null) {
							imageView.setImageBitmap(bitmap);
						} else {
							imageView.setImageResource(img_default);
						}
						cache.put(url, bitmap);
					} else {
						imageView.setImageResource(img_default);
						// 在gallery和listview滚动过程中会出现反复启动下载线程的问题，
						// 因为一个url可能已经启动一个子线程开始下载了，
						// 但是还没下载完，adapter的getview方法再次调用这个方法
						// 这个时候可能会再启一遍同一幅图的下载
						// 这里建了一个set，当url第一次出现时进入下载线程，
						// 出现重复情况则跳过；
						// 当出现httpConnection TImeOut情况时，从该set里删除此url
						if (!urlSet.contains(url)) {
							BitmapDownloaderTask task = new BitmapDownloaderTask(
									imageView, cache, imgFile, imageSize);
							task.execute(url);
							Log.v("download", savePath + albumName + "/"
									+ imageName);
							urlSet.add(url);
						}
					}
				}
			} else {
				imageView.setImageResource(img_default);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 
	 * FunName: clearCache Description: 清空缓存 Create Date: 2012/04/18
	 */
	public void clearCache() {
		cache.clear();
		File[] files = cacheDir.listFiles();
		for (File f : files)
			f.delete();
	}

}
